/*
 * Clase que crea una instancia de unidad para representar una entidad
 * de la raza en el juego. Extiende de LectorXMLRaza para actualizar
 * los valores de los atributos acuerdo a la raza.
 */
package fuente;


import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class Unidades extends Raza {
    private int _velocidad,
                _vida,
                _vidaMax,
                _carga,
                _costo,
                _fuerza,
                _religion,
                _magia,
                _inteligencia,
                _posX,
                _posY;
    

    private String _tipoUnidad;
    
    public Unidades(String pRaza, String pTipoUnidad, int pNivel) throws ParserConfigurationException, 
                                                                         SAXException, IOException {
        
        super(pRaza);        
        this._tipoUnidad = pTipoUnidad;
        
        leerXMLUnidad(pNivel, pTipoUnidad);        
            
    }    
    
    private void leerXMLUnidad(int pNivel, String pTipoUnidad) throws ParserConfigurationException, 
                                                 SAXException, IOException {
        
        DocumentBuilderFactory docBF = DocumentBuilderFactory.newInstance();
        DocumentBuilder docB = docBF.newDocumentBuilder();
        org.w3c.dom.Document doc = docB.parse(new File("src/xml/Unidades.xml"));
        
        doc.getDocumentElement().normalize();
        
        NodeList nivelesLista = doc.getElementsByTagName("Nivel");
        for (int i  = 0; i < nivelesLista.getLength(); i++) {
            Node nivel = nivelesLista.item(i);
            Element eNivel = (Element)(nivel);
            
            int atribNivel = Integer.parseInt(eNivel.getAttribute("Numero"));
            NodeList unidad = eNivel.getElementsByTagName(pTipoUnidad);
            if (atribNivel <= pNivel) {
                
                if (unidad.item(0) == null) {
                }
                else if (pTipoUnidad.equals("Bond007")) {
                    Node entidad = unidad.item(0);
                    Element eEntidad = (Element)(entidad);
                    _costo=Integer.parseInt(getTagValue("Costo", eEntidad));
                }
                else {
                    Node entidad = unidad.item(0);
                    Element eEntidad = (Element)(entidad);
                    _carga = Integer.parseInt(getTagValue("Carga", eEntidad));
                    _vida = Integer.parseInt(getTagValue("Vida", eEntidad));
                    _vidaMax = _vida;
                    _fuerza = Integer.parseInt(getTagValue("Fuerza", eEntidad));
                    _velocidad=Integer.parseInt(getTagValue("Velocidad", eEntidad));
                    _inteligencia=Integer.parseInt(getTagValue("Inteligencia", eEntidad));
                    _costo=Integer.parseInt(getTagValue("Costo", eEntidad));
                    _religion=Integer.parseInt(getTagValue("Religion", eEntidad));
                    _magia=Integer.parseInt(getTagValue("Magia", eEntidad));
                    break;
                }
            }
            else {
                System.out.println("La unidad no esta disponible, compre el nivel correspondiente");
                break;
            }
        }    
     
    }

    /* Inicio implementacion de getters y setters */
    /**
     * Metodo que obtiene el valor de una etiqueta en el archivo .XML.
     * @param tag Etiqueta a buscar
     * @param e elemento en donde se encuentra la etiqueta
     * @return Valor de la etiqueta
     */
    private String getTagValue(String tag, Element e) {
        NodeList lista = e.getElementsByTagName(tag).item(0).getChildNodes();
        
        Node valor = (Node) lista.item(0);
        
        return valor.getNodeValue();
    }
    
    /**
     * 
     * @return los puntos de velocidad
     */
    public int getVelocidad() {
        return _velocidad;
    }
    
    /**
     * @return los puntos de vida
     */
    public int getVida() {
        return _vida;
    }
    
    /**
     * @return los puntos de vida Maxima
     */
    public int getVidaMax() {
        return _vidaMax;
    }
    
    /**
     * @return los puntos de carga Maxima
     */
    public int getCarga() {
        return _carga;
    }
    
    /**
     * @return los puntos del costo
     */
    public int getCosto() {
        return _costo;
    }
    
    /**
     * @return los puntos de fuerza
     */
    public int getFuerza() {
        return _fuerza;
    }
    
    /**
     * @return los puntos de religion
     */
    public int getReligionUnidad() {
        return _religion;
    }
    
    /**
     * @return los puntos de fuerza
     */
    public int getMagia() {
        return _magia;
    }
    
    /**
     * @return los puntos de Inteligencia
     */
    public int getInteligencia() {
        return _inteligencia;
    }
    
    /**
     * @return la posicion X
     */
    public int getPosX() {
        return _posX;
    }
    
    /**
     * @return la posicion Y
     */
    public int getPosY() {
        return _posY;
    }
    
    /**
     * @return el Tipo de Unidad 
     */
    public String getTipoUnidad() {
        return _tipoUnidad;
    }
    
    /**
     * @param pVelocidad los puntos de velocidad de la unidad
     */
    public void setVelocidad(int pVelocidad) {
        this._velocidad = pVelocidad;
    }

    /**
     * @param pVida los puntos de vida de la unidad
     */
    public void setVida(int pVida) {
        this._vida = pVida;
    }

    /**
     * @param pVidaMax los puntos de vida Maxima de la unidad
     */
    public void setVidaMax(int pVidaMax) {
        this._vidaMax = pVidaMax;
    }

    /**
     * @param pCarga los puntos de carga de la unidad
     */
    public void setCarga(int pCarga) {
        this._carga = pCarga;
    }

    /**
     * @param pCosto los puntos de costo de la unidad
     */
    public void setCosto(int pCosto) {
        this._costo = pCosto;
    }

    /**
     * @param pFuerza los puntos de fuerza de la unidad
     */
    public void setFuerza(int pFuerza) {
        this._fuerza = pFuerza + super.getPtosFuerza();
    }

    /**
     * @param pReligion los puntos de religion de la unidad
     */
     public void setReligion(int pReligion) {
        this._religion = pReligion + super.getPtosReligion();
    }
 
    /**
     * @param pMagia los puntos de magia de la unidad
     */
    public void setMagia(int pMagia) {
        this._magia = pMagia + super.getPtosMagia();
    }

    /**
     * @param pInteligencia los puntos de inteligencia de la unidad
     */
    public void setInteligencia(int pInteligencia) {
        this._inteligencia = pInteligencia + super.getPtosIntelecto();
    }
    
    /**
     * @param pPosX la poicion X de la unidad
     */
    public void setPosX(int pPosX) {
        this._posX = pPosX;
    }

    /**
     * @param pPosY la poicion Y de la unidad
     */
    public void setPosY(int pPosY) {
        this._posY = pPosY;
    }

    /**
     * @param pTipoUnidad el nombre de la Unidad
     */
    public void setTipoUnidad(String pTipoUnidad) {
        this._tipoUnidad = pTipoUnidad;
    }
    /* Fin implementacion de getters y setters */
    
}
